package heraclito;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdesktop.application.Action;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;

public class HeraclitoView extends FrameView {

    JTabbedPane Abas = new JTabbedPane(); //Abas
    int Contador; //Controle das telas e edição para permitir interações
    Edicao TelasEdicao[]; //Array para armazenar os objetos(Telas de Edição) para permitir interação junto com a variavel Contador
    SelecaoExemplos TelaExemplos;
    String UserID;
    BemVindo BV;

    public HeraclitoView(SingleFrameApplication app) {
        super(app);

        initComponents();

        //Atualiza variaveis de controle
        Contador = 1;
        TelasEdicao = new Edicao[100];
        mainPanel.add(Abas); //Adiciona a aba no painel principal

        Abas.setBounds(5, 5, 1200, 1000); //Formata a posição e tamanho da ABA (Esquerda, Topo, Largura, Altura)

        BV = new BemVindo(this); //Cria o objeto Bem Vindo
        Abas.add("Bem Vindo", BV); //Adiciona o objeto Bem Vindo na Abazzz
    }

    public void NovoTeorema() { //Ação chamada pela tela "Bem Vindo"
        AcaoNovo(); //Chama a ação de abrir uma nova tela de edição de teoremas
    }

    public void AbrirExemplo() { //Ação chamada pela tela "Bem Vindo"
        AcaoExemploTeoremas(); //Chama a ação de abrir uma tela para selecionar os exemplos de teoremas
    }

    @Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = HeraclitoApp.getApplication().getMainFrame();
            aboutBox = new HeraclitoAboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        HeraclitoApp.getApplication().show(aboutBox);
    }

    //Menu Arquivo
    @Action
    public void AcaoNovo() {
        TelasEdicao[Contador] = new Edicao(this); //Cria uma nova tela de Edição na posição Contador do array de telas para permitir interação

        Abas.setSelectedComponent(Abas.add("Prova" + Contador, TelasEdicao[Contador])); //Joga essa nova tela em uma nova aba, selecionando-a

        Contador++; //Atualiza variaveis de controle
    }

    @Action
    public void AcaoSalvar() {
        if (Abas.getSelectedComponent() instanceof Edicao) {
            ((Edicao) Abas.getSelectedComponent()).Salvar();
        } //Aciona a função de Salvar da tela que está sendo usada (Utiliza-se o indice das abas pois coincidem com o índice dos arrays)
    }

    @Action
    public void AcaoAbrir() {
        if (Abas.getSelectedComponent() instanceof Edicao) {
            ((Edicao) Abas.getSelectedComponent()).Abrir();//Aciona a função de Abrir da tela que está sendo usada (Utiliza-se o indice das abas pois coincidem com o índice dos arrays)
        }
    }

    @Action
    public void AcaoFechar() {
        if (Abas.getSelectedIndex() != 0) { //Verifica se não é a tela "Bem Vindo"
            if (TelaExemplos != null) {
                if (Abas.getSelectedIndex() == TelaExemplos.getIndexAba()) {
                    TelaExemplos = null;
                }
            }
            Abas.remove(Abas.getSelectedIndex()); //Remove a tela selecionada
        }
    }

    //Menu Editar
    @Action
    public void AcaoDesfazer() {
        if (Abas.getSelectedComponent() instanceof Edicao) {
            ((Edicao) Abas.getSelectedComponent()).Desfazer(); //Aciona a função de Desfazer da tela que está sendo usada (Utiliza-se o indice das abas pois coincidem com o índice dos arrays)
        }
    }

    @Action
    public void AcaoRefazer() {
        if (Abas.getSelectedComponent() instanceof Edicao) {
            ((Edicao) Abas.getSelectedComponent()).Refazer(); //Aciona a função de Refazer da tela que está sendo usada (Utiliza-se o indice das abas pois coincidem com o índice dos arrays)
        }
    }

    //Menu Opções
    @Action
    public void AcaoExemploTeoremas() {
        if (TelaExemplos == null) {
            TelaExemplos = new SelecaoExemplos(Abas.getComponentCount());
            //Abrir a Tela Selecao Exemplos
            Abas.setSelectedComponent(Abas.add("Exemplos", TelaExemplos)); //Abre a tela de exemplo de teoremas
        } else {
            Abas.setSelectedIndex(TelaExemplos.getIndexAba());
        }
    }

    @Action
    public void AcaoProvasExistentes() {
        AcaoNovo();
        TelasEdicao[Contador - 1].Abrir(); //Aciona a função de Abrir da tela que está sendo usada (Utiliza-se o indice das abas pois coincidem com o índice dos arrays)
    }

    @Action
    public void AcaoManual() {
        try {
            java.awt.Desktop.getDesktop().browse(java.net.URI.create("http://obaa.unisinos.br/downloads/Manual_do_Heraclito.pdf"));
        } catch (IOException ex) {
            Logger.getLogger(BemVindo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean RealizaLogin(String username, String password) {
        if (username.equals("") || password.equals("")) {
            return false;
        }
        if (WS2FIPAGateway.login2(username, password)) {
            UserID = username;
            for (int x = 1; x < Contador; ++x) {
                TelasEdicao[x].informaLogado();
            }
            return true;
        }
        return false;
    }

    public void RealizaLogoff() {
        UserID = null;
        WS2FIPAGateway.logoff();
        for (int x = 1; x < Contador; ++x) {
            TelasEdicao[x].informaLogado();
        }
    }

    public String getUserID() {
        return UserID;
    }

    public BemVindo getBV() {
        return BV;
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem9 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem7 = new javax.swing.JMenuItem();
        jMenuItem8 = new javax.swing.JMenuItem();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenuItem10 = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();

        mainPanel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        mainPanel.setMaximumSize(new java.awt.Dimension(60000, 60000));
        mainPanel.setName("mainPanel"); // NOI18N
        mainPanel.setPreferredSize(new java.awt.Dimension(1200, 1500));
        mainPanel.addAncestorListener(new javax.swing.event.AncestorListener() {
            public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
            }
            public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
            }
            public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
                mainPanelAncestorAdded(evt);
            }
        });
        mainPanel.setLayout(new java.awt.GridLayout());

        menuBar.setName("menuBar"); // NOI18N

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(heraclito.HeraclitoApp.class).getContext().getResourceMap(HeraclitoView.class);
        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(heraclito.HeraclitoApp.class).getContext().getActionMap(HeraclitoView.class, this);
        jMenuItem1.setAction(actionMap.get("AcaoNovo")); // NOI18N
        jMenuItem1.setText(resourceMap.getString("mnuNovo.text")); // NOI18N
        jMenuItem1.setName("mnuNovo"); // NOI18N
        fileMenu.add(jMenuItem1);

        jMenuItem2.setAction(actionMap.get("AcaoSalvar")); // NOI18N
        jMenuItem2.setText(resourceMap.getString("mnuSalvar.text")); // NOI18N
        jMenuItem2.setName("mnuSalvar"); // NOI18N
        fileMenu.add(jMenuItem2);

        jMenuItem9.setAction(actionMap.get("AcaoAbrir")); // NOI18N
        jMenuItem9.setText(resourceMap.getString("jMenuItem9.text")); // NOI18N
        jMenuItem9.setName("jMenuItem9"); // NOI18N
        fileMenu.add(jMenuItem9);

        jMenuItem3.setAction(actionMap.get("AcaoFechar")); // NOI18N
        jMenuItem3.setText(resourceMap.getString("mnuFechar.text")); // NOI18N
        jMenuItem3.setName("mnuFechar"); // NOI18N
        fileMenu.add(jMenuItem3);

        jMenuItem4.setAction(actionMap.get("quit")); // NOI18N
        jMenuItem4.setText(resourceMap.getString("mnuSair.text")); // NOI18N
        jMenuItem4.setName("mnuSair"); // NOI18N
        fileMenu.add(jMenuItem4);

        menuBar.add(fileMenu);

        jMenu2.setText(resourceMap.getString("jMenu2.text")); // NOI18N
        jMenu2.setName("jMenu2"); // NOI18N

        jMenuItem7.setAction(actionMap.get("AcaoDesfazer")); // NOI18N
        jMenuItem7.setText(resourceMap.getString("mnuDesfazer.text")); // NOI18N
        jMenu2.add(jMenuItem7);

        jMenuItem8.setAction(actionMap.get("AcaoRefazer")); // NOI18N
        jMenuItem8.setText(resourceMap.getString("mnuRefazer.text")); // NOI18N
        jMenuItem8.setName("mnuRefazer"); // NOI18N
        jMenu2.add(jMenuItem8);

        menuBar.add(jMenu2);

        jMenu1.setText(resourceMap.getString("jMenu1.text")); // NOI18N
        jMenu1.setName("jMenu1"); // NOI18N

        jMenuItem6.setAction(actionMap.get("ProvarTeorema")); // NOI18N
        jMenuItem6.setText(resourceMap.getString("mnuProvar.text")); // NOI18N
        jMenuItem6.setName("mnuProvar"); // NOI18N
        jMenu1.add(jMenuItem6);

        jMenuItem10.setAction(actionMap.get("AcaoExemploTeoremas")); // NOI18N
        jMenuItem10.setText(resourceMap.getString("jMenuItem10.text")); // NOI18N
        jMenuItem10.setName("jMenuItem10"); // NOI18N
        jMenu1.add(jMenuItem10);

        menuBar.add(jMenu1);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        aboutMenuItem.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                aboutMenuItemMouseClicked(evt);
            }
        });
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        setComponent(mainPanel);
        setMenuBar(menuBar);
    }// </editor-fold>//GEN-END:initComponents

    private void aboutMenuItemMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_aboutMenuItemMouseClicked
        // TODO add your handling code here:
    }//GEN-LAST:event_aboutMenuItemMouseClicked

    private void mainPanelAncestorResized(java.awt.event.HierarchyEvent evt) {//GEN-FIRST:event_mainPanelAncestorResized
        // TODO add your handling code here:
        Abas.setBounds(5, 5, this.getFrame().getSize().width - 30, this.getFrame().getSize().height - 70); //Formata a posição e tamanho da ABA (Esquerda, Topo, Largura, Altura)
    }//GEN-LAST:event_mainPanelAncestorResized

    private void mainPanelAncestorAdded(javax.swing.event.AncestorEvent evt) {//GEN-FIRST:event_mainPanelAncestorAdded
        // TODO add your handling code here:
        this.getFrame().setExtendedState(JFrame.MAXIMIZED_BOTH);//maximiza a janela
    }//GEN-LAST:event_mainPanelAncestorAdded
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem10;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    // End of variables declaration//GEN-END:variables
    private JDialog aboutBox;
}
